# TODO: 导入必要的库和模块

# TODO: 加载保存的KNN模型，这样我们可以使用预训练的模型进行预测

# TODO: 定义预测函数，这个函数将用于Gradio接口进行预测

# TODO: 创建Gradio接口，这个接口将用于用户输入和显示预测结果

# TODO: 启动Gradio接口，用户可以通过这个接口进行交互





import gradio as gr
import numpy as np
from PIL import Image, ImageDraw
import pickle

# 加载最优KNN模型
with open('best_knn_model.pkl', 'rb') as f:
    knn_model = pickle.load(f)

def predict_digit(stroke):
    """
    接收一个手写数字的笔画数据，并使用KNN模型进行预测。
    参数：
        stroke (list): 包含用户手写笔画数据的列表。
    返回：
        str: 预测的数字。
    """
    # 创建一个空白图像
    image = Image.new('RGB', (280, 280), color=(255, 255, 255))
    draw = ImageDraw.Draw(image)

    # 绘制每一笔画
    for points in stroke:
        draw.line(points, fill="black", width=5)

    # 将图像转换为灰度模式并调整大小为8x8像素
    image = image.resize((8, 8), Image.Resampling.LANCZOS).convert('L')
    # 将图像转换为numpy数组并进行归一化
    image_array = np.array(image) / 255.0
    # 将图像数组转换为二维数组
    image_array = image_array.flatten()

    # 使用模型进行预测
    prediction = knn_model.predict([image_array])[0]
    # 获取预测的数字
    predicted_digit = np.argmax(prediction)
    return str(predicted_digit)

# 创建Gradio界面
iface = gr.Interface(
    fn=predict_digit,
    inputs=gr.Sketchpad(label="Draw a digit"),
    outputs="text",
    title="Handwritten Digit Recognition",
    description="Draw a digit in the box and we'll tell you what it is."
)

# 启动Gradio接口，用户可以通过这个接口进行交互
iface.launch()

